package com.docparser.processor;

import java.util.HashMap;
import java.util.Map;

/**
 * 处理数学符号的专门处理器。
 */
public class MathSymbolProcessor {
    /**
     * 符号映射表
     */
    private static final Map<String, String> MATH_SYMBOLS = new HashMap<String, String>() {{
        // 希腊字母
        put("α", "\\alpha");
        put("β", "\\beta");
        put("γ", "\\gamma");
        put("δ", "\\delta");
        put("ε", "\\varepsilon");
        put("ζ", "\\zeta");
        put("η", "\\eta");
        put("θ", "\\theta");
        put("ι", "\\iota");
        put("κ", "\\kappa");
        put("λ", "\\lambda");
        put("μ", "\\mu");
        put("ν", "\\nu");
        put("ξ", "\\xi");
        put("π", "\\pi");
        put("ρ", "\\rho");
        put("σ", "\\sigma");
        put("τ", "\\tau");
        put("υ", "\\upsilon");
        put("φ", "\\phi");
        put("χ", "\\chi");
        put("ψ", "\\psi");
        put("ω", "\\omega");
        
        // 大写希腊字母
        put("Α", "\\Alpha");
        put("Β", "\\Beta");
        put("Γ", "\\Gamma");
        put("Δ", "\\Delta");
        put("Ε", "\\Epsilon");
        put("Ζ", "\\Zeta");
        put("Η", "\\Eta");
        put("Θ", "\\Theta");
        put("Ι", "\\Iota");
        put("Κ", "\\Kappa");
        put("Λ", "\\Lambda");
        put("Μ", "\\Mu");
        put("Ν", "\\Nu");
        put("Ξ", "\\Xi");
        put("Π", "\\Pi");
        put("Ρ", "\\Rho");
        put("Σ", "\\Sigma");
        put("Τ", "\\Tau");
        put("Υ", "\\Upsilon");
        put("Φ", "\\Phi");
        put("Χ", "\\Chi");
        put("Ψ", "\\Psi");
        put("Ω", "\\Omega");

        // 数学运算符
        put("+", "+");
        put("-", "-");
        put("×", "\\times");
        put("·", "\\cdot");
        put("÷", "\\div");
        put("±", "\\pm");
        put("∓", "\\mp");
        put("=", "=");
        put("≠", "\\neq");
        put("≈", "\\approx");
        put("≡", "\\equiv");
        put("∝", "\\propto");
        put("≤", "\\leq");
        put("≥", "\\geq");
        put("<", "<");
        put(">", ">");
        
        // 集合运算符
        put("∈", "\\in");
        put("∉", "\\notin");
        put("⊂", "\\subset");
        put("⊃", "\\supset");
        put("⊆", "\\subseteq");
        put("⊇", "\\supseteq");
        put("∪", "\\cup");
        put("∩", "\\cap");
        put("∅", "\\emptyset");
        
        // 其他数学符号
        put("∞", "\\infty");
        put("∂", "\\partial");
        put("∇", "\\nabla");
        put("√", "\\sqrt");
        put("∫", "\\int");
        put("∑", "\\sum");
        put("∏", "\\prod");
        put("…", "\\cdots");
        put("⋯", "\\cdots");
    }};

    /**
     * 检查字符串是否为数学符号
     */
    public static boolean isMathSymbol(String text) {
        return MATH_SYMBOLS.containsKey(text);
    }

    /**
     * 获取符号的LaTeX表示
     */
    public static String getLatexSymbol(String symbol) {
        String latex = MATH_SYMBOLS.get(symbol);
        // 如果是希腊字母或需要后跟空格的符号，添加空格
        if (latex != null && (latex.matches("\\\\[a-zA-Z]+") || 
            latex.matches("\\\\(times|cdot|pm|mp)"))) {
            return latex + " ";
        }
        return latex != null ? latex : symbol;
    }

    /**
     * 检查字符串是否为上标数字
     */
    public static boolean isSuperscriptNumber(String text) {
        return text.matches("[⁰¹²³⁴⁵⁶⁷⁸⁹]+");
    }

    /**
     * 将上标数字转换为LaTeX格式
     */
    public static String convertSuperscriptToLatex(String superscript) {
        StringBuilder result = new StringBuilder("^{");
        for (char c : superscript.toCharArray()) {
            switch (c) {
                case '⁰': result.append('0'); break;
                case '¹': result.append('1'); break;
                case '²': result.append('2'); break;
                case '³': result.append('3'); break;
                case '⁴': result.append('4'); break;
                case '⁵': result.append('5'); break;
                case '⁶': result.append('6'); break;
                case '⁷': result.append('7'); break;
                case '⁸': result.append('8'); break;
                case '⁹': result.append('9'); break;
            }
        }
        result.append('}');
        return result.toString();
    }

    /**
     * 清理数学符号格式
     */
    public static String cleanSymbols(String formula) {
        String result = formula;
        for (Map.Entry<String, String> entry : MATH_SYMBOLS.entrySet()) {
            result = result.replace(entry.getKey(), entry.getValue() + " ");
        }
        return result
            .replaceAll("\\\\([a-zA-Z]+)\\s+([a-zA-Z])", "\\\\$1 $2")
            .replaceAll("\\s+", " ")
            .trim();
    }
}